<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>深挖继承</title>
</head>
<body>
    
</body>
</html>
<script>
    //继承是为了服用代码，继承的本质是将原型指向另外一个对象


    // function User(name){
    //     this.name = name;
    //     // console.log(this)
    // }

    // User.prototype.getUserName = function(){
    //     return this.name;
    // }

    // function Admin(name){
    //     //使用这种方式调用的时候，this指代的是window对象
    //     //所有初始化赋值的时候 吧name给了window对象  并没有给当前对象
    //     // User(name);
    //     User.call(this,name);
    // }

    // Admin.prototype = Object.create(User.prototype);
    // Admin.prototype.role = function(){};

    // let xj = new Admin("向军大书");
    // console.log(xj.getUserName());
    // console.log(name)


    //原型工厂
    //原型工厂是将继承的过程进行封装，使用继承业务简单化
    // function extend(sub,sup){
    //     sub.prototype = Object.create(sup.prototype);
    //     // sub.prototype.constructor = sub;
    //     Object.defineProperty(sub.prototype,'constructor',{
    //         value:sub,
    //         enumerable:false
    //     });
    //     // console.log(Object.getOwnPropertyDescriptor(sub.prototype,'constructor'));
    // }

    // function Access(){}
    // function User(){}
    // function Admin(){}
    // function Member(){}

    // extend(User,Access);//User继承Access
    // // console.dir(User);
    // extend(Admin,User);//Admin继承User
    // // console.dir(Admin);
    // extend(Member,Access);
    // // console.dir(Member);

    // Access.prototype.rules = function(){};
    // User.prototype.getName = function(){};

    // console.log(new Admin());//继承关系 Admin>User>Access>Object
    // console.log(new Member());//继承关系 Member > Access > Object

    //对象工厂
    function User(name,age){
        this.name = name;
        this.age = age;
    }

    User.prototype.show = function(){
        console.log(this.name,this.age);
    }

    function Admin(name,age){
        //新创建一个对象  对象的原型是User
        let instance = Object.create(User.prototype);
        //进行对象的实例化，改变对象为新创建的对象
        User.call(instance,name,age);
        instance.role = function(){
            console.log('admin.role...');
        }
        return instance;
    }


    let hd = Admin("后盾人",19);
    hd.show();

    function Member(name,age){
        let instance = Object.create(User.prototype);
        User.call(instance,name,age);
        return instance;
    }

    let lisi = Member("李四",28);
    lisi.show();
    
</script>